package com.spring.format.code.generation.util.file;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;

import com.spring.format.code.generation.constants.FileNameEnumType;
import com.spring.format.code.generation.mybatis.po.TablePO;
import com.spring.format.code.generation.mybatis.vo.CreateFileVO;
import com.spring.format.code.generation.mybatis.vo.JavaAttributeVO;
import com.spring.format.code.generation.util.FieldUtil;
import com.spring.format.code.generation.util.ImportClassUtil;
import com.spring.format.code.generation.util.NameUtil;
import com.spring.format.code.generation.util.PathUtil;

/**
 * 文件生成帮助类
 * 
 * @author lenovo
 *
 */
public class CommonPOFileUtil {
	private CommonPOFileUtil() {

	}

	public static String content(CreateFileVO fileVO) {

		TablePO tablePO = fileVO.getTablePO();
		List<JavaAttributeVO> attrVOList = fileVO.getAttrVOList();
		// poName
		String poName = NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.PO_NAME);
		// 需要引入的类，类型的临时存储集合
		Set<String> hasImport = new HashSet<>();

		StringBuilder importStr = new StringBuilder();
		// 文件头部 package，import 部分
		importStr.append(head(tablePO));

		StringBuilder attribute = new StringBuilder();
		// 类说明， basePO部分
		attribute.append(classBegin(tablePO, poName));

		StringBuilder methodStr = new StringBuilder();
		for (JavaAttributeVO attrVO : attrVOList) {
			// 根据 数据类型，引入类
			String importTemp = ImportClassUtil.importJavaPath(attrVO);
			// 没有被引入过，引入。比如Date有的类里面有多个Date字段，只需引入一次
			if (StringUtils.isNotBlank(importTemp) && !hasImport.contains(importTemp)) {
				importStr.append(importTemp);
				// 放入已经引入的结果集合
				hasImport.add(importTemp);
			}
			String[] importArray = FieldUtil.importField(attrVO);
			if (null != importArray) {
				attribute.append(importArray[0]);
				methodStr.append(importArray[1]);
			}
		}
		attribute.append(" \n\n");
		attribute.append(constractor(tablePO, attrVOList));
		// 拼接get，set方法
		attribute.append(methodStr)
				// toString
				.append(toString(poName))
				// 类结束
				.append("} //end class");
		// 拼接为返回str
		StringBuilder resultStr = new StringBuilder();
		resultStr.append(importStr).append(attribute);

		return resultStr.toString();

	}

	public static String classBegin(TablePO tablePO, String poName) {
		StringBuilder attribute = new StringBuilder();
		attribute.append("/**\n").append("  *").append(tablePO.getTable_comment()).append("\n").append("  *@author ")
				.append(System.getProperties().getProperty("user.name")).append("\n").append("  *@version 1.0.0 ")
				.append(DateUtil.dateToStr(new Date())).append(" \n").append("  */\n").append("public class ")
				.append(poName).append(" extends BasePO implements Serializable { \n").append("	 /** 序列化 */\n")
				.append("	 private static final long serialVersionUID = ").append(System.currentTimeMillis())
				.append("L;\n");
		return attribute.toString();
	}

	/** 文件头部 **/
	public static String head(TablePO tablePO) {
		StringBuilder importStr = new StringBuilder();
		importStr.append("package ")
				.append(PathUtil.createPackagePath(tablePO.getTable_name(), FileNameEnumType.PO_NAME)).append(" \n")
				.append("import java.io.Serializable; \n").append("import com.sx.common.util.json.JackJsonUtil; \n")
				.append("import com.fasterxml.jackson.annotation.JsonInclude; \n ");
		return importStr.toString();
	}

	/** 构造方法 **/
	public static String constractor(TablePO tablePO, List<JavaAttributeVO> attrVOList) {
		StringBuilder attribute = new StringBuilder();
		/** 构造方法 **/
		attribute.append("	public ").append(NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.PO_NAME))
				.append("(){ \n").append("		super() ; \n").append("	} \n");
		/** 构造方法 **/
		attribute.append("	public ").append(NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.PO_NAME))
				.append("(").append(attrVOList.get(0).getType()).append("  ")
				.append(attrVOList.get(0).getName().toLowerCase()).append(" ){\n").append("		super() ; \n")
				.append("		this.").append(attrVOList.get(0).getName().toLowerCase()).append(" = ")
				.append(attrVOList.get(0).getName().toLowerCase()).append(" ;\n").append("	} \n");
		return attribute.toString();
	}

	public static String toString(String poName) {
		StringBuilder str = new StringBuilder();
		str.append("@Override \n ").append("public String toString() { \n ").append("return \"").append(poName)
				.append(":\"+JackJsonUtil.objToJson(this); \n ").append(" } \n ");
		return str.toString();
	}
}
